package com.jianan.mis.util;

import java.security.*;
import javax.crypto.spec.*;
import javax.crypto.*;

/**
 *
 * <p>Title:DES加密小程序 </p>
 *
 * <p>Description:使用JCE进行DES文件加密的例子 </p>
 *
 * <p>Copyright: 2005</p>
 *
 * <p>Company:武汉大学计算机学院02级计科2班 </p>
 *
 * @author 李洲
 * @version 1.0
 */
public class BytesCipher {

    //默认使用des加密
    private static String algorithm = "DES";

    /**
     * 使用JDK中的JCE生成密钥
     * @return byte[] 密钥
     * @throws Exception 没有这种加密算法
     */
    public static byte[] generateKey() throws Exception {
        try {
            //生成一个可信任的随机数源
            SecureRandom sr = new SecureRandom();
            //为我们选择的DES算法生成一个KeyGenerator对象
            KeyGenerator kg = KeyGenerator.getInstance(algorithm);
            kg.init(sr);
            //生成密钥
            SecretKey key = kg.generateKey();
            //返回密钥的二进制形式
            return key.getEncoded();
        } catch (Exception e) {
            throw new Exception("没有这种加密算法");
        }
    }

    /**
     * 根据密钥对明文进行加密，返回密文
     * @param plaintext byte[] 明文
     * @param key byte[] 密钥
     * @return byte[] 密文
     * @throws Exception 加密过程中出现的各种异常
     */
    public static byte[] encrypt(byte[] plaintext, byte[] key) throws Exception {
        try {
            //产生一个可信任的随机数源
            SecureRandom sr = new SecureRandom();
            //从原始密钥数据创建DESKeySpec对象
            DESKeySpec dks = new DESKeySpec(key);
            //创建一个密钥工厂，然后用它把DESKeySpec转换成Secret Key对象
            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(algorithm);
            SecretKey keySpec = keyFactory.generateSecret(dks);
            //Cipher对象实际完成加密操作
            Cipher cipher = Cipher.getInstance(algorithm);
            //用密钥初始化Cipher对象
            cipher.init(Cipher.ENCRYPT_MODE, keySpec, sr);
            //执行加密操作
            byte[] cryptotext= cipher.doFinal(plaintext);
            return cryptotext;
        } catch (InvalidKeyException e) {
            throw new Exception("密钥非法");
        } catch (NoSuchAlgorithmException e) {
            throw new Exception("没有这种加密算法");
        } catch (BadPaddingException e) {
            throw new Exception("加密失败");
        }
    }

    /**
     * 根据密钥对密文进行加密，返回明文
     * @param cryptotext byte[] 密文
     * @param key byte[] 密钥
     * @return byte[] 明文
     * @throws Exception 解密过程中出现的各种异常
     */
    public static byte[] decrypt(byte[] cryptotext, byte[] key) throws Exception {
        try {
            //产生一个可信任的随机数源
            SecureRandom sr = new SecureRandom();
            //从原始密钥数据创建DESKeySpec对象
            DESKeySpec dks = new DESKeySpec(key);
            //创建一个密钥工厂，然后用它把DESKeySpec转换成Secret Key对象
            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(algorithm);
            SecretKey keySpec = keyFactory.generateSecret(dks);
            //Cipher对象实际完成解密操作
            Cipher cipher = Cipher.getInstance(algorithm);
            //用密钥初始化Cipher对象
            cipher.init(Cipher.DECRYPT_MODE, keySpec, sr);
            //执行解密操作
            byte[] plaintext= cipher.doFinal(cryptotext);
            return plaintext;
        } catch (InvalidKeyException e) {
            throw new Exception("密钥非法");
        } catch (NoSuchAlgorithmException e) {
            throw new Exception("没有这种解密算法");
        } catch(IllegalBlockSizeException e) {
            throw new Exception("密钥长度非法");
        }catch (BadPaddingException e) {
            throw new Exception("解密失败");
        }
    }
}
